/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is Forte for Java, Community Edition. The Initial
* Developer of the Original Code is Sun Microsystems, Inc. Portions
* Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.objectbrowser;
import java.util.*;
import java.text.MessageFormat;
import org.openide.loaders.DataFilter;
import org.openide.loaders.DataFolder;
import org.openide.loaders.DataObject;
import org.openide.util.NbBundle;
import org.apache.regexp.*;
/**
* This class represents sort of filters for object browser.
* Each filter has name and set of subfilters (connected with ||).
* It stores currently selected filter too. Packages filter
* can be visually customized using PackagesFilterEditor.
*
* @author Jan Jancura
*/
class PackagesFilter implements java.io.Serializable {
// static ....................................................................................
static final long serialVersionUID = 3372096529946664837L;
static String resolve (String s) {
int i = s.indexOf ('*');
int k = s.indexOf ('.');
boolean aster = true;
if ((i < 0) || ((k >= 0) && (k < i))) {
aster = false;
i = k;
}
int j = 0;
StringBuffer sb = new StringBuffer ();
while (i >= 0) {
sb.append (s.substring (j, i));
if (aster) sb.append (".*"); // NOI18N
else sb.append ("[.]"); // NOI18N
j = i + 1;
i = s.indexOf ('*', j);
k = s.indexOf ('.', j);
if ((i < 0) || ((k >= 0) && (k < i))) {
aster = false;
i = k;
} else
aster = true;
}
sb.append (s.substring (j));
return new String (sb);
}
// variables ....................................................................................
/** Set of filter names. */
Vector filterNames;
/** Set of subilters for each filter.
* @associates Vector*/
Vector filterValues;
/** Index of currently selected filter.*/
int index = 0;
// init .........................................................................................
/**
* Creates a new set of filter containing "All packages" filter.
*/
PackagesFilter () {
filterNames = new Vector ();
filterNames.add (NbBundle.getBundle (PackagesFilter.class).getString ("CTL_All_packages"));
filterValues = new Vector ();
Vector v = new Vector ();
filterValues.add (v);
}
// main methods .....................................................................
/**
* @return DataFilter which represents currently selected filter.
*/
DataFilter getDataFilter () {
StringBuffer sb = new StringBuffer ();
sb.append ('^');
if ((index < 0) || (filterValues.size () == 0))
sb.append (".*"); // NOI18N
else {
Vector v = (Vector) filterValues.elementAt (index);
if (v.size () == 0)
sb.append (".*"); // NOI18N
else {
sb.append (((Filter) v.elementAt (0)).getFilter ());
int i, k = v.size ();
for (i = 1; i < k; i++)
sb.append ('|').append (((Filter) v.elementAt (i)).getFilter ());
}
}
sb.append ('$');
return new InnerFilter (new String (sb));
}
/**
* Sets current filter.
*/
void setSelected (int i) {
index = i;
}
// innerclasses .........................................................................
/**
* Subfilter interface. Each filter must be able to represents themselves as
* a regular expression.
*/
static interface Filter extends java.io.Serializable {
static final long serialVersionUID = -6206484035199019046L;
String getFilter ();
}
/**
* Wildcard subfilter.
*/
static class PackageFilter implements Filter {
static final long serialVersionUID = -8168688048152187338L;
String packageName = "com.*"; // NOI18N
public String getFilter () {
return PackagesFilter.resolve (packageName.trim ());
}
public String toString () {
return new MessageFormat (
NbBundle.getBundle (PackagesFilter.class).
getString ("CTL_Wildcard_filter")
).format (new Object[] {packageName});
}
}
/**
* Regular expression subfilter.
*/
static class RegularFilter implements Filter {
static final long serialVersionUID =1579868234167461686L;
String expression = ".*"; // NOI18N
public String getFilter () {
return expression;
}
public String toString () {
return new MessageFormat (
NbBundle.getBundle (PackagesFilter.class).
getString ("CTL_Regular_filter")
).format (new Object[] {expression});
}
}
/**
* Packages subfilter.
*/
static class PackageListFilter implements Filter {
static final long serialVersionUID = 7083525471921225108L;
String expression = ".*"; // NOI18N
public String getFilter () {
return expression;
}
public String toString () {
return new MessageFormat (
NbBundle.getBundle (PackagesFilter.class).
getString ("CTL_Packages_filter")
).format (new Object[] {expression});
}
}
/**
* DataFilter which encapsulates Regular expression parser.
*/
private static class InnerFilter implements DataFilter {
static final long serialVersionUID = 7205717425719798916L;
RE re;
InnerFilter (String exp) {
try {
re = new RE (exp);
} catch (RESyntaxException e) {
e.printStackTrace ();
}
}
public boolean acceptDataObject (DataObject d) {
return re.match (d.getPrimaryFile ().getPackageName ('.'));
}
}
}
/*
* Log
* 10 Gandalf 1.9 1/13/00 Radko Najman I18N
* 9 Gandalf 1.8 12/15/99 Jan Jancura Bug 3039 + Bug 4917
* 8 Gandalf 1.7 12/15/99 Jan Jancura Bug 4906
* 7 Gandalf 1.6 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun
* Microsystems Copyright in File Comment
* 6 Gandalf 1.5 9/13/99 Jan Jancura Regexp implementation
* changed.
* 5 Gandalf 1.4 8/18/99 Jan Jancura Localization
* 4 Gandalf 1.3 8/9/99 Ian Formanek Generated Serial Version
* UID
* 3 Gandalf 1.2 6/10/99 Jan Jancura OB settings & save of
* filters
* 2 Gandalf 1.1 6/9/99 Ian Formanek ---- Package Change To
* org.openide ----
* 1 Gandalf 1.0 5/12/99 Jan Jancura
* $
*/